﻿namespace Tszy.Unlimited.Base.Infrastructure.Queues.RabbitMQ;

/// <summary>
/// 交换机类型。
/// </summary>
public static class RabbitMQExchangeType
{
    /// <summary>
    /// 消息中的路由键（routing key）如果和 Binding 中的 binding key 一致， 交换器就将消息发到对应的队列中。
    /// </summary>
    /// <remarks>
    /// 路由键与队列名完全匹配，如果一个队列绑定到交换机要求路由键为“dog”，
    /// 则只转发 routing key 标记为“dog”的消息，不会转发“dog.puppy”，也不会转发“dog.guard”等等。
    /// 它是完全匹配、单播的模式。
    /// </remarks>
    public const string DIRECT = "direct";

    /// <summary>
    /// topic 交换器通过模式匹配分配消息的路由键属性，将路由键和某个模式进行匹配，此时队列需要绑定到一个模式上。
    /// </summary>
    /// <remarks>
    /// 将路由键和绑定键的字符串切分成单词，这些单词之间用点隔开。
    /// 它同样也会识别两个通配符：符号“#”和符号“”。#匹配0个或多个单词，匹配不多不少一个单词。
    /// </remarks>
    public const string TOPIC = "topic";

    /// <summary>
    /// 所有 bind 到此 exchange 的 queue 都可以接收消息。
    /// </summary>
    public const string FANOUT = "fanout";

    /// <summary>
    /// 验证交换机类型是否有效。
    /// </summary>
    /// <param name="exchangeType">交换机类型。</param>
    /// <returns>有效返回 True，否则返回 False。</returns>
    public static bool Check(string exchangeType)
    {
        if (string.IsNullOrWhiteSpace(exchangeType))
        {
            return false;
        }

        return exchangeType switch
        {
            DIRECT or TOPIC or FANOUT => true,
            _ => false,
        };
    }
}